#include<iostream>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<cstdio>
#include<cstdlib>
#include<fcntl.h>
#include<pthread.h>

using namespace std;
/*
    条件等待是线程同步的一种手段，如果只有一个线程，一直等下去
条件一直都不会被满足，所以必须有一个线程通过某一个操作，改变
共享变量，使得原先不满足的条件得到满足，并且通知正在等待的线程
条件不会无缘无故地突然得到满足，必然会牵扯到共享数据的变化，所以
一定要用互斥锁来保护，否则无法安全的获取和修改数据
====================代码规范  解锁和等待必须是一个原子操作
在等待进程等待有结果之前不可以解锁，同样的在通知进程通知成功
之前不可以解锁
*/
// pthread_cond_t cond;
// pthread_mutex_t mutex;

// void* thread1(void* args)
// {
//     while(true)
//     {
//         pthread_cond_wait(&cond,&mutex);
//         cout<<"running"<<endl;
//     }
// }
// void* thread2(void* args)
// {
//     while(true)
//     {
//         pthread_cond_signal(&cond);
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t t1,t2;
    
//     pthread_cond_init(&cond,nullptr);
//     pthread_mutex_init(&mutex,nullptr);

//     pthread_create(&t1,nullptr,thread1,nullptr);
//     pthread_create(&t2,nullptr,thread2,nullptr);

//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);

//     pthread_cond_destroy(&cond);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }
// int tickets=20;
// pthread_mutex_t mutex;

// void* threadRoutine(void* args)
// {
//     char* who=(char*)args;
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             sleep(1);
//             tickets--;
//             cout<<who<<" send "<<tickets<<" tickets "<<endl;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_mutex_init(&mutex,nullptr);
//     pthread_t t1,t2,t3;

//     pthread_create(&t1,nullptr,threadRoutine,(void*)"thread 1");
//     pthread_create(&t2,nullptr,threadRoutine,(void*)"thread 2");
//     pthread_create(&t3,nullptr,threadRoutine,(void*)"thread 3");

//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);

//     //最后要记得将锁进行回收
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }
// int tickets=20;
// pthread_mutex_t mutex;
// void* threadRoutine(void* args)
// {
//     char* msg=(char*)args;
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             tickets--;
//             cout<<(char*)msg<<" send "<<tickets<<" tickets "<<endl;
//             sleep(1);
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t t1,t2,t3;
//     //锁的属性就不再设置了
//     pthread_mutex_init(&mutex,nullptr);

//     pthread_create(&t1,nullptr,threadRoutine,(void*)"thread 1");
//     pthread_create(&t2,nullptr,threadRoutine,(void*)"thread 2");
//     pthread_create(&t3,nullptr,threadRoutine,(void*)"thread 3");

//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);

//     pthread_mutex_destroy(&mutex);
//     return 0;
// }